import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.sql.*;

public class Authentification extends JDialog implements ActionListener, KeyListener {

  private JLabel lAuth;
  private JTextField tAuth;
  private JButton bOk;
  private JButton bInsc;
  private JButton bQuit;
  private Container contenu;
  public boolean ok;
  public String logUsr;

  public Authentification() {
    super((JDialog) null, true);

    this.setResizable(false);
    this.setTitle("Authentification");
    this.setBounds(20, 20, 320, 160);

    this.lAuth = new JLabel("Login");
    this.tAuth = new JTextField();
    this.tAuth.addKeyListener(this);

    this.bOk = new JButton("Se connecter");
    this.bOk.addActionListener(this);

    this.bInsc = new JButton("S'inscrire");
    this.bInsc.addActionListener(this);

    this.bQuit = new JButton("Quitter");
    this.bQuit.addActionListener(this);

    this.contenu = getContentPane();
    this.contenu.setLayout(null);

    this.contenu.add(this.lAuth);
    this.contenu.add(this.tAuth);
    this.contenu.add(this.bOk);
    this.contenu.add(this.bInsc);
    this.contenu.add(this.bQuit);

    this.lAuth.setBounds(20, 20, 100, 20);
    this.tAuth.setBounds(140, 20, 162, 20);
    this.bOk.setBounds(20, 60, 120, 20);
    this.bInsc.setBounds(180, 60, 120, 20);
    this.bQuit.setBounds(100, 100, 120, 20);

     this.setResizable(false);
    this.setVisible(true);
  }

  public void actionPerformed(ActionEvent e) {
    if (e.getSource() == bOk) {
      this.compare();
    }
    if (e.getSource() == bInsc) { // On s'inscrit
      boolean ok=false;
      String login, mail;
      
      // Demande du login tant qu'il est incorrect, si on clique sur annuler, retour à la fenêtre de connexion
      do {
        login = JOptionPane.showInputDialog(this, "Entrez votre login : ", "Inscription", JOptionPane.QUESTION_MESSAGE);
        if(login!=null) {
          try {
            User.verifNom(login);
            ok=true;
          }
          catch (Exception pbNom) { 
            JOptionPane.showMessageDialog(this, pbNom.getMessage(), "Erreur", JOptionPane.ERROR_MESSAGE);
            ok=false;
          }
        }
        else
          ok=true;
      } while(!ok);
      
      // Si on a pas déjà quitté, on demande le mail tant qu'il est incorrect ou que l'utilisateur quitte
      if(login!=null) {
        do {
          mail = JOptionPane.showInputDialog(this, "Entrez votre mail : ", "Inscription", JOptionPane.QUESTION_MESSAGE);
          if(mail!=null) {
            try {
              User.verifMail(mail);
              ok=true;
            }
            catch (Exception pbMail) { 
              JOptionPane.showMessageDialog(this, pbMail.getMessage(), "Erreur", JOptionPane.ERROR_MESSAGE);
              ok=false;
            }
          }
          else
            ok=true;
        } while(!ok);
      
        // Si on a entré un login et un mail, on tente la création d'un nouvel utilisateur
        if(mail!=null) {
          try {
            User nvUser = new User(login, mail);
            JOptionPane.showMessageDialog(this, "Inscription réussie.\nLogin : "+nvUser.getNom()+"\nMail : "+nvUser.getMail(), "Inscription", JOptionPane.QUESTION_MESSAGE);
          }
          catch (SQLException err) { JOptionPane.showMessageDialog(this, "Erreur, connexion à la base de donnée impossible : "+err, "Erreur BDD", JOptionPane.ERROR_MESSAGE); }
        }
      }
    }
    if (e.getSource() == bQuit) {
      System.exit(0);
    }
  }

  public void compare() {
    boolean userExists = false;
    try 
    {
        userExists = User.existNom(this.tAuth.getText());
        if (userExists) 
        {
          this.ok = true;
          this.logUsr = tAuth.getText();
          this.dispose();
        } else {
          JOptionPane.showMessageDialog(this, "Erreur sur le login, inscrivez-vous ou quittez.", "Erreur de login", JOptionPane.WARNING_MESSAGE);
        }
    } catch (SQLException e) { JOptionPane.showMessageDialog(this, "Erreur, connexion à la base de donnée impossible : "+e, "Erreur BDD", JOptionPane.ERROR_MESSAGE); }
  }

  public void keyTyped(KeyEvent e) { }

  public void keyPressed(KeyEvent e) {
    int key = e.getKeyCode();
    switch(key) {
      case KeyEvent.VK_ESCAPE: System.exit(0); break;
      case KeyEvent.VK_ENTER: this.compare(); break;
    }  
  }

  public void keyReleased(KeyEvent e) { }
}
